package main

import (
	"fmt"
	"time"
)

/*
  定时器，标准库中的Timer让用户可以定义自己的超时逻辑，尤其是在应对select处理多个channel的超时、单channel读写的超时等情形时尤为方便.

  Timer常见的创建方式：
  t:= time.NewTimer(d)      创建一个新的计时器，该计时器将在其通道上至少持续d之后发送当前时间
  t:= time.AfterFunc(d, f)
  c:= time.After(d)         在等待持续时间之后，然后在返回的通道上发送当前时间,它相当于NewTimer(d).C
      timer.Stop            计时器停止

  Timer有3个要素:
  定时时间：就是那个d
  触发动作：就是那个f
  时间channel： 也就是t.C
 */
func main() {

	//新建一个计时器：timer
	timer := time.NewTimer(3 * time.Second)
	fmt.Printf("%T\n", timer)
	fmt.Println(time.Now())

	//此处在等待channel中的信号，执行此段代码时会阻塞3秒
	ch01 := timer.C
	fmt.Println(<-ch01)

	/*
	   func After(d Duration) <-chan Time
	       返回一个通道：chan，存储的是d时间间隔后的当前时间。
	*/
	ch02 := time.After(3 * time.Second) //3s后
	fmt.Printf("%T\n", ch02) // <-chan time.Time
	fmt.Println(time.Now())
	time2 := <-ch02
	fmt.Println(time2)
}
